#ifndef __oop3_hash_table_h
#define __oop3_hash_table_h
#include "stdio.h"
#include <stdint.h>
typedef void *Pointer;
typedef unsigned (*HashFunction)(char *key);
typedef void (*Destructor)(Pointer);
struct list
{
    char *key;
	int NumOfRep;
    struct list *next;
};
typedef struct list List;
struct hashtable 
{
    size_t size;
    List **table;
    uint32_t (*HashFunction)(char* key);
    Destructor dtor;
};
typedef struct hashtable HashTable;
extern uint32_t JenkinsHashFunct (char* key);
void createHashTable(HashTable* pT, size_t InitialNumOfElem);
void printAllAdresses(HashTable* pT);
void* getData(HashTable* pT,char* key);
void* pro_getData(HashTable* pT,char* key);
void pro_printAllAdresses(HashTable* pT);
int has_key(HashTable* pT,char* key);
void PastNode(List* CurrNode,List* InsertNode);
void setData(HashTable* pT, List* InsertNode);
void deleteHashTable(HashTable* pT);
void deleteData(HashTable* pT,char* key);
int GetNextWord(FILE* pFile, char* str);
List createNode(char*);
void PrintDataToFile(FILE* pFile,HashTable* pT);
void PrintAllNotNullNodes(HashTable* pT);
#endif